import axios from 'axios';
import { useUserStore } from '@/stores/user';
import { Toast } from 'vant';

const { VITE_APP_BASE_URL } = import.meta.env;

const request = axios.create({
  // API 请求的默认前缀
  baseURL: VITE_APP_BASE_URL,
  timeout: 600 * 1000 // 请求超时时间
});

// 异常拦截处理器
const errorHandler = (error) => {
  const code = error.code;
  switch (code) {
    case 'ECONNABORTED':
      error.message = '请求超时';
      break;
  }
  const status = error.response?.status;
  switch (status) {
    case 400:
      error.message = '请求错误';
      break;
    case 401:
      error.message = '未授权，请登录';
      break;
    case 403:
      error.message = '拒绝访问';
      break;
    case 404:
      error.message = `请求地址出错: ${error.response?.config.url}`;
      break;
    case 408:
      error.message = '请求超时';
      break;
    case 500:
      error.message = '服务器内部错误';
      break;
    case 501:
      error.message = '服务未实现';
      break;
    case 502:
      error.message = '网关错误';
      break;
    case 503:
      error.message = '服务不可用';
      break;
    case 504:
      error.message = '网关超时';
      break;
    case 505:
      error.message = 'HTTP版本不受支持';
      break;
    default:
      break;
  }
  Toast({ message: error.message, duration: 1000 });
  return Promise.reject(error);
};

request.interceptors.request.use((config) => {
  const user = useUserStore();
  // 让每个请求携带自定义参数，可根据实际情况自行修改
  if (user.isLogin) {
    config.headers['x-token'] = user.xToken;
  }
  return config;
}, errorHandler);

// response interceptor
request.interceptors.response.use((response) => {
  const dataAxios = response.data;
  // 这个状态码是和后端约定的
  const { code, msg } = dataAxios;
  // 根据 code 进行判断
  if (code === undefined) {
    // 如果没有 code 代表这不是项目后端开发的接口
    return dataAxios;
  }
  // 有 code 代表这是一个后端接口 可以进行进一步的判断
  switch (code) {
    case 1:
      // code === 0 代表没有错误
      return dataAxios;
    case -1:
      // code === 1 代表请求错误
      throw Error(msg);
    case 401:
      throw Error(msg);
    default:
      // 不是正确的 code
      return dataAxios;
  }
}, errorHandler);

export default request;

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function post(url, data) {
  return request.post(url, data);
}

export function get(url, params) {
  return request.get(url, { params });
}
